package com.fank.spike.mapper.order;

import com.fank.spike.entity.SeckillOrder;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import javax.xml.crypto.Data;
import java.math.BigDecimal;
import java.util.Date;

/**
 * <p>
 *  Mapper 接口
 *
 *     在秒杀中，我们要避免同一个用户多次抢购同一件商品，在sql中必须限制这一点（因为即使前端怎么控制
 *     都无法避免用户多次请求同一个接口，所谓接口防刷）。所以在设计订单表的时候用了联合主键且不自增的
 *     方式，以用户id和用户手机号组成联合主键，这样当同一个用户（手机号相同）多次抢购同一个商品时插入sql
 *     就会产生主键冲突的问题，这样就会报错。
 * </p>
 *
 * @author fanxk123
 * @since 2019-02-25
 */
@Mapper
@Component
public interface SeckillOrderMapper extends BaseMapper<SeckillOrder> {

    /**
     * 减库存  （减库存：执行update语句，令stock_count字段依次减一，并且当前要在一系列where条件的限制下）
     * @param seckillId 秒杀商品id
     * @param killTime 秒杀时间
     * @return 返回次sql更新记录数，如果>=1表示更新成功
     */
    int reduceStock(@Param("seckillId") long seckillId, @Param("killTime")Date killTime);

    /**
     * 插入购买订单明细（保存订单数据，这里为接口防刷用联合主键seckillId, userPhone，如果同一个用户多次抢购同一件商品导致主键冲突会直接报错，为了避免系统不直接报错设计了ignore实现主键冲突就直接返回0表示该条SQL执行失败）
     * @param seckillId 秒杀到商品的id
     * @param money     秒杀的金额
     * @param userPhone 秒杀的用户
     * @return
     */
    int insertOrder(@Param("seckillId") long seckillId, @Param("money") BigDecimal money, @Param("userPhone") long userPhone);
}
